package simulaco.web.action;

import gminet.infra.business.BusinessException;
import gminet.infra.db.TransactionException;
import gminet.infra.web.WebException;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

import simulaco.business.LoginBusiness;
import simulaco.business.UsuarioBusiness;
import simulaco.dto.Usuario;

@ManagedBean(name = "usuarioAction")
@RequestScoped
public class UsuarioAction extends WebAction {

    private static final long serialVersionUID = 7615732452537044688L;

    private Usuario usuario;
    private String novaSenhaAcesso;
    private String confirmacaoSenhaAcesso;

    public UsuarioAction() {
        super();
    }

    public String iniciar() {

        if (getUsuarioLocal() == null) {
            return "acessaUsuario";
        } else {
            return "iniciaUsuario";
        }
    }

    public String prepararCadastro() throws WebException {

        return "cadastraUsuario";
    }

    public String cadastrar() throws WebException {

        String pageReturn = "";
        try {
            if (!this.usuario.getSenhaAcesso().equals(getConfirmacaoSenhaAcesso())) {
                throw new BusinessException("Confirmação de senha inválida.");
            }
            Usuario usuarioLocal = UsuarioBusiness.insert(this.usuario);
            setUsuarioLocal(usuarioLocal);
            pageReturn = "iniciaUsuario";
        } catch (BusinessException be) {
            addBusinessException("frmUsuario", be);
            pageReturn = "cadastraUsuario";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararAlteracaoDados() throws WebException {

        verificarLogin();
        setUsuario(getUsuarioLocal());
        return "alteraUsuario";
    }

    public String alterarDados() throws WebException {

        verificarLogin();
        String pageReturn = "";
        try {
            Usuario novoUsuario = UsuarioBusiness.update(this.usuario);
            setUsuarioLocal(novoUsuario);
            // GRAVA MENSAGEM PARA O USUARIO
            addMessage("frmUsuario", "Dados alterados com sucesso!");
            //
            pageReturn = iniciar();
        } catch (BusinessException be) {
            addBusinessException("frmUsuario", be);
            pageReturn = "alteraUsuario";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public String prepararAlteracaoSenha() throws WebException {

        verificarLogin();
        setUsuario(getUsuarioLocal());
        return "alteraAcessoUsuario";
    }

    public String alterarSenha() throws WebException {

        verificarLogin();
        String pageReturn = "";
        try {
            if (!getNovaSenhaAcesso().equals(getConfirmacaoSenhaAcesso())) {
                throw new BusinessException("Confirmação de senha inválida.");
            }
            //
            if (LoginBusiness.verifyLogin(this.usuario)) {
                this.usuario.setSenhaAcesso(getNovaSenhaAcesso());
                UsuarioBusiness.updatePassword(this.usuario);
                // GRAVA MENSAGEM PARA O USUARIO
                addMessage("frmUsuario", "Senha alterada com sucesso!");
            }
            //
            pageReturn = iniciar();
        } catch (BusinessException be) {
            addBusinessException("frmUsuarioPassword", be);
            pageReturn = "alteraAcessoUsuario";
        } catch (TransactionException te) {
            throw new WebException(te);
        }
        return pageReturn;
    }

    public Usuario getUsuario() {
        if (this.usuario == null) {
            this.usuario = new Usuario();
        }
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public String getNovaSenhaAcesso() {
        return novaSenhaAcesso;
    }

    public void setNovaSenhaAcesso(String novaSenhaAcesso) {
        this.novaSenhaAcesso = novaSenhaAcesso;
    }

    public String getConfirmacaoSenhaAcesso() {
        return confirmacaoSenhaAcesso;
    }

    public void setConfirmacaoSenhaAcesso(String confirmacaoSenhaAcesso) {
        this.confirmacaoSenhaAcesso = confirmacaoSenhaAcesso;
    }

}
